package modelo;

import java.sql.Date;
import java.util.List;
import java.util.Map.Entry;

import modelo.tp2.Tramo;
import Excepciones.AvionLlenoException;
import Excepciones.CodigoValidacionErroneoException;
import Excepciones.ContrasenaIncorrectaException;
import home.HomeMemoria;
import home.HomePersistencia;
import home.HomePersistenciaHibernate;

public class Sistema {
	HomeMemoria homeMemoria;
	HomePersistencia homePersistencia;
	HomePersistenciaHibernate homePersistenciaHibernate;

	public Sistema(){
		this.homeMemoria = new HomeMemoria();
		this.homePersistencia = new HomePersistencia();
	}
	
	public Sistema(HomeMemoria hm, HomePersistencia hp){
		this.homeMemoria = hm;
		this.homePersistencia = hp;
	}
	
	public Sistema(HomePersistenciaHibernate hph){
		this.homePersistenciaHibernate = hph;
	}
	
	public void enviarCodigoA(Usuario u){
		u.setCodigo_validacion(u.getNombre_usuario()+"aaa");
	}

	public void crearUsuario(String nombre_usuario, String nombre,
			String apellido, String email, String fechaNac, String contrasena) {
			Usuario u = new Usuario(nombre_usuario, nombre, apellido ,email, fechaNac, contrasena);
			//this.getHomeMemoria().anadirUsuario(u,r.nextLong());
			try {
				this.getHomePersistencia().anadirUsuario(u, u.getNombre_usuario() + "aaa");
			} catch (Exception e) {
				e.printStackTrace();
			}
			this.enviarCodigoA(u);
	}

	public void validarCuenta(String nombre_usuario, String l) throws Exception {
//		if(this.getHomeMemoria().traerUsuarioYCodigo(u.getNombre_usuario()).getValue() == u.getCodigo_validacion()){
//			u.setValidado(true);
//		}
		String codigo = this.getHomePersistencia().traerCodigoValidacion(nombre_usuario);
		if(l.equals(codigo)){
			this.getHomePersistencia().validarUsuario(nombre_usuario);
		}else{
			throw new CodigoValidacionErroneoException();
		}
	}
	
	public void loguear(String nombreUsuario, String contrasena) {
		Entry<Usuario, Long> us = this.getHomeMemoria().traerUsuarioYCodigo(nombreUsuario);
		if(contrasena.equals(us.getKey().getContrasena())){
			us.getKey().setEstado("ONLINE");
		}else{
			throw new ContrasenaIncorrectaException();
		}
	}
	
	public void cambiarContrasenaDe(String nombre_usuario, String contrasenaVieja,
			String contrasenaNueva) throws Exception {
//		Entry<Usuario, Long> us = this.getHomeMemoria().traerUsuarioYCodigo(usuario.getNombre_usuario());
//		if(contrasenaVieja.equals(us.getKey().getContrasena()) && contrasenaVieja != contrasenaNueva){
//			us.getKey().setContrasena(contrasenaNueva);
//		}else{
//			throw new ContrasenaIncorrectaException();
//		}
		String contrasena = this.getHomePersistencia().obtenerContrasenaDe(nombre_usuario);
		if(contrasena.equals(contrasenaVieja)){
			this.getHomePersistencia().actualizarContrasenaDe(nombre_usuario, contrasenaNueva);
		}else{
			throw new ContrasenaIncorrectaException();
		}
	}
	
	//Como usuario quiero reservar un asiento en un determinado tramo.
	
	//Como usuario quiero reservar un conjunto de asientos, comprando todos o ninguno
	public void reservarAsientoParaEn(Usuario usuario, int asientosQuePido, List<Asiento> asientosDisponibles){
		//List<Asiento> asientosDisponibles = this.asientosDisponibles(tramo);
		if(asientosDisponibles.size() >= asientosQuePido){
			this.asignarUsuarioAAsiento(usuario, asientosDisponibles, asientosQuePido);
		}else{
			throw new AvionLlenoException();
		}
	}
	
	public void asignarUsuarioAAsiento(Usuario usuario, List<Asiento> asientosDisponibles, int asientosQuePido){
		this.getHomePersistenciaHibernate().asignarAsientosDeA(usuario, asientosDisponibles, asientosQuePido);
	}
	
	public void pagarReserva(Asiento a){
		a.setPagado(true);
	}
	
	//Como usuario quiero consultar los asientos disponibles para un determinado tramo.
	public List<Asiento> asientosDisponibles(Tramo tramo){
		return this.getHomePersistenciaHibernate().asientosDisponiblesDe(tramo);
	}
	
	
	/////////////////////////ACCESORS////////////////////////////////////
	
	public HomePersistenciaHibernate getHomePersistenciaHibernate() {
		return homePersistenciaHibernate;
	}

	public void setHomePersistenciaHibernate(
			HomePersistenciaHibernate homePersistenciaHibernate) {
		this.homePersistenciaHibernate = homePersistenciaHibernate;
	}
	
	public HomePersistencia getHomePersistencia() {
		return homePersistencia;
	}

	public void setHomePersistencia(HomePersistencia homePersistencia) {
		this.homePersistencia = homePersistencia;
	}
	
	public HomeMemoria getHomeMemoria() {
		return homeMemoria;
	}

	public void setHomeMemoria(HomeMemoria homeMemoria) {
		this.homeMemoria = homeMemoria;
	}
}